package com.yeyks.commonReference.service.consumer;

import com.baomidou.mybatisplus.extension.service.IService;
import com.yeyks.common.dto.UserMemberCardWebDTO;
import com.yeyks.common.param.UserMemberCardQueryParam;
import com.yeyks.commonReference.pojo.param.activity.HotelJipInvite.ActivityHotelJipInviteActiveCardParam;
import com.yeyks.consumer.dal.domain.MemberCard;
import com.yeyks.consumer.dal.domain.UserMemberCard;
import com.yeyks.consumer.dto.UserMemberCardDTO;
import com.yeyks.consumer.param.UserMemberCard.*;
import org.springframework.transaction.annotation.Transactional;

import java.util.List;
import java.util.Map;


/**
 * <p>
 * 用户会员卡表 服务类
 * </p>
 *
 * @author yun
 * @since 2019-06-25
 */
public interface UserMemberCardService extends IService<UserMemberCard> {

    /**
     * 通过用户id查询该用户的会员卡信息
     *
     * @param userId
     * @return UserMemberCard
     */
//    UserMemberCard getByUserId(Integer userId);

    //    @Override
//    public UserMemberCard getByUserId(Integer userId) {
//        return baseMapper.getByUserId(userId);
//    }

    //查询用户信息
    UserMemberCard getUserMemberCard(Integer userid, Integer cardType);

    /**
     * 通过用户查询该用户的会员卡信息
     *
     * @param userInfo
     * @return UserMemberCardDTO
     */
    UserMemberCardDTO getDTOByUserId(UserMemberCardInfoParam param);

    /**
     * 用户设置支付密码
     *
     * @param payPassword
     * @param loginUser
     */
    void setPwd(UserMemberCardSetPwdParam param);

    /**
     * 用户修改支付密码
     *
     * @param oldPassword
     * @param newPassword
     * @param loginUser
     */
    void updatePwd(UserMemberCardUpdatePwdParam param);

    /**
     * 增加会员卡金额
     *
     * @param payAmount
     * @param giveAmount
     * @param userId
     * @param type
     * @param remark     账单类型：0充值，1消费
     * @param orderNo    充值订单号
     * @return
     */
    Boolean addAmount(UserMemberCardAddAmountParam param);

    /**
     * 减少会员卡金额
     *
     * @param amount
     * @param userId  用户id
     * @param remark  备注
     * @param type    账单类型：0充值，1消费
     * @param orderNo 消费订单号
     * @return
     */
    void descAmount(Integer amount, Integer userId, Integer type, String remark, String orderNo, Integer cardType);

    //jip邀请活动绑卡
    @Transactional(rollbackFor = Exception.class)
    void inviteActivityUserBindCard(ActivityHotelJipInviteActiveCardParam param);

    /**
     * 用户绑卡
     *
     * @param cardNo
     * @param password
     * @param payPassword
     * @param userInfo
     * @return
     */
    void userBindCard(UserMemberCardBindCardParam param);

    /**
     * 检测用户支付密码是否正确
     *
     * @param userId
     * @param password
     * @return
     */
    Boolean checkPayPassword(Integer userId, Integer cardType, String password);

    /**
     * 使用钱包支付
     *
     * @param userId
     * @param password
     * @param payAmount
     * @param orderNo
     * @return
     */
    Boolean cardPay(Integer userId, String password, Integer payAmount, String orderNo, Integer cardType);

    /**
     * 校验用户需要绑定的会员卡信息
     */
    MemberCard checkCard(String cardNo, String password, Integer userId,Integer cardType);

    /**
     * 生成充值订单
     *
     * @param payAmount
     * @param userInfo
     * @return
     */
    Map<String, Object> rechargeOrder(UserMemberCardRechargeOrderParam param);

    /**
     * 会员卡充值
     *
     * @param loginUser
     * @param type
     * @param openId
     * @param remoteIP
     * @param id
     * @return
     */
    Object rechargePay(UserMemberCardRechargePayParam param);


    /**
     * 判断 用户是否是甄选用户
     *
     * @param userId
     * @return
     */
    Boolean checkUserVip(Integer userId, Integer cardType);

    /**
     * 分页查询会员列表
     * @param param
     * @return
     */
    List<UserMemberCardWebDTO> queryByParam(UserMemberCardQueryParam param);

    /**
     * 查询行数
     *
     * @param param
     * @return
     */
    int queryCount(UserMemberCardQueryParam param);

    /**
     * 通过会员卡id和卡类型查询该用户卡信息
     *
     * @param cardId
     * @return
     */
    UserMemberCard selectByCardId(Long cardId, Integer cardType);

    //检查卡密码是否可以设置
    boolean checkPwd(Integer userId, Integer cardType);

}
